// Copyright (C) 2022 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
//
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<广西木子科技有限公司>，授权编号：<NT220402151538>，代码指纹：<A.648883738.885>，技术对接人微信：<ID: Lingmuziyi>】
// 【授权寄送：<收件：李先生、地址：南宁市科园西十路11号国电智能大厦1101F、电话：17736659550、邮箱：yingshashou@vip.qq.com>】
//
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
//
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rainbowchat.http.file.d;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.eva.epc.common.util.CommonUtils;
import com.eva.framework.httpfile.FileDownload;
import com.eva.framework.utils.LoggerFactory;
import com.x52im.rainbowchat.BaseConf;

/**
 * 短视频下载实用类。
 * <p>
 * <b>补充：</b>下传文件时，Android、iOS、Web等都是可以在通过上传URL中将
 * 参数带过来，所以直接在HttpServletRequest里拿出url里的参数就行了。
 *
 * @author Json
 * @since 4.4
 */
//FIXME: 在更苛刻的安全性要求下，可考虑要求客户端把token字段带上来，以便进行更强的合法身份检查
public class ShortVideoDownloader extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
    private static final long serialVersionUID = 1L;

    /* (non-Java-doc)
     * @see javax.servlet.http.HttpServlet#HttpServlet()
     */
    public ShortVideoDownloader() {
        super();
    }

    /**
     * Servlet规范中本protected方法由public void service(,,)方法调用, 而public void service(,,)
     * 则由Web容器调用(所以它是public公共方法),因此一般情况下尽量避免重写public void service(,,)方法
     * ,而重写父类的本protedted方法则比较合理.
     */
    protected void service(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        LoggerFactory.getLog().debug("[HTTP][短视频_DOWN]下载短视频：你传过来的参数" +
                "user_uid=" + req.getParameter("user_uid") // 读取图片的人（目前服务端保留，暂未使用）
                + ",file_name=" + req.getParameter("file_name")
                + ",file_md5=" + req.getParameter("file_md5")
                + ",[---- " + req.getContextPath() + "-" + req.getRequestURL() + "]");

        String userUid = req.getParameter("user_uid");
        String file_name = req.getParameter("file_name");
        String file_md5 = req.getParameter("file_md5");

        try {
            // 处理短视频下载
            processShortVideoDownload(res, userUid
                    , BaseConf.getInstance().getDIR_USER_SHORTVIDEO_UPLOAD(), file_name, file_md5);

        } catch (IOException e) {
            throw e;
        } catch (Exception e2) {
            throw new IOException(e2.getMessage(), e2.getCause());
        }
    }

    /**
     * HTTP短视频文件下载实现方法.
     * <p>
     * 本方法没有任何异常地返回即意味着成功处理完成.
     *
     * @param res
     * @param userUid
     * @param file_dir  要下载的文件所位于的服务器磁盘目录（此dir的结尾需要"/"哦）
     * @param file_name 要下载的短视频真正文件名（此文件名主要是用于显示时，不是磁盘上的物理文件名哦），客户端下载时读取到的文件名就是本参数
     * @param file_md5  短视频文件的md5码（实际上短视频文件存放于服务端磁盘上的文件名是md5码命名的）
     * @throws IOException
     */
    private void processShortVideoDownload(HttpServletResponse res
            , String userUid, String file_dir, String file_name, String file_md5) throws IOException {
        try {
            if (!CommonUtils.isStringEmpty(file_name, true)) {
                LoggerFactory.getLog().debug("[HTTP][短视频_DOWN]用户【" + userUid + "】要下载的短视频文件 " + file_name
                        + "将立即开始处理过程 ......");
                // 实施文件下载
                FileDownload.download(res, file_dir + file_md5, file_name, FileDownload.CONTENT_TYPE_MP4, false);
            } else
                LoggerFactory.getLog().warn("[HTTP][短视频_DOWN]对不起,用户【" + userUid + "】要下载的短视频(file_name=" + file_name + ")不存在！");
        } catch (Exception e) {
            LoggerFactory.getLog().warn("[HTTP][短视频_DOWN]用户【" + userUid + "】的下载的短视频文件不存在，本次下次已提前结束(" + e.getMessage() + ")");
        }
    }

}
